有限狀態機,大概大家都聽過吧,沒聽過的
不過基本上都是用到的時候學啦,以前有看了幾天,發現我的智力不足,先放棄
但最近專題要開始使用,所以…火坑我來了
看完中文,建議研究一下英文的,下面有實作
本篇是根據英文的實作改了一下做出來的筆記,說是筆記,因為是雛形,然後又不知道哪邊觀念可能錯誤,請多多指教一下XD
研究了這麼久,我認為實作有限狀態機,最重要的概念是
繼承,抽象
整個看起來是這樣,完成之後才要在創建個AIController去使用它
首先先創建個基類BaseState,此類別為抽象類別
繼承他的實作他的DoSomething(Gameobject npc)方法,這個抽象方法
很重要,因為所有繼承他的類別都有這個方法,至於為何,等到用到會再說明
接下來,開始創建使用它的機器,((先不用創建它有哪些狀態))
這個類也是不用繼承MonoBehavior,因為真正要用狀態機的不是這個類
首先,狀態”機”,的機,肯定是集合很多狀態而成的,因此宣告一個List把所有狀態都
裝在一起,再宣告當前狀態 currentstate ,在建構子上為這個list創建空間,狀態機可能
會有,新增、查詢、刪除…等 ,因為只是筆記最簡單的怎麼用,因此用一個普通的新增
方法就好。
好,接下來可以想一下你要什麼狀態了,這裡先用A狀態跟B狀態來表示,創建每個狀態
然後繼承於BaseState類
B狀態也跟這上面一樣,我就不貼囉,然後選好狀態之後,差不多就完成了
接下來要創建個控制器,也就是最終你會貼到Unity的編輯室窗上的component,也可以說成AI
首先,在這個AI裡面,要先創建個狀態機,也就是剛剛集合所有State的 FSMMachine
接著把所有會用到的State宣告一下
接著宣告完之後,在Start方法中把它(狀態) 加入到創建的fsm中
fsm中,加入了a、b狀態,currentstate是目前狀態,因為一開始沒指定,所以在start方法也順變指定為a
接著再Update中,呼叫doSomthing方法,傳入gameobject
注意這邊 fsm.currentstate ,上面再Start方法中指定為a,因此目前做的是a的dosomthing方法
如果把fsm.currentstate = b的話,就會執行b的dosomthing方法,這裡就是精華所在了
換另外一個狀態,上一個狀態就不會再繼續執行,就像switch case做的狀態機一樣
而目前的Controller中,沒辦法轉換狀態,因此加入一個ToState方法
傳入一State,然後改變fsm的currentstate(當前狀態)
完整如下
這個類就完成了,接著去每個狀態中實現他們的方法
如果按下滑鼠左鍵,則轉換到狀態b,因該不用多解釋了吧XD
接著把Controller掛到隨便一個物體上,運行就會像這樣
另外,Unity還有使用interface實現FSM的方法,個人比較喜歡那個,比較簡潔。
參考資料 : http://wiki.unity3d.com/index.php/Finite_State_Machine